package com.tepth.remote.core.net.retrofit;

import android.content.Context;

import com.tepth.remote.core.net.callback.IError;
import com.tepth.remote.core.net.callback.ISuccess;
import com.tepth.remote.core.net.loader.LoaderStyle;

import java.io.File;
import java.util.WeakHashMap;

import okhttp3.MediaType;
import okhttp3.RequestBody;

/**
 * Description:Retrofit连接构造类
 *
 * @author Hequn.Lee
 * @date 2018/11/8
 */
public class RxRetrofitClientBuilder {

    /**
     * 连接地址
     */
    private String mUrl = null;
    /**
     * 请求的参数
     */
    private final WeakHashMap<String, Object> PARAMS = new WeakHashMap<>();
    /**
     * 请求体
     */
    private RequestBody mBody = null;
    /**
     * 上下文
     */
    private Context mContext = null;
    /**
     * 上传的文件
     */
    private File mFile = null;
    /**
     * 菊花样式
     */
    private LoaderStyle mLoaderStyle;
    /**
     * 成功请求回调
     */
    private ISuccess mSuccess;
    /**
     * 失败请求回调
     */
    private IError mError;

    RxRetrofitClientBuilder() {
    }

    /**
     * 传入请求地址
     *
     * @param url 请求地址
     * @return 构造类
     */
    public final RxRetrofitClientBuilder url(String url) {
        this.mUrl = url;
        return this;
    }

    /**
     * 传入请求参数集合
     *
     * @param params 请求参数集合
     * @return 构造类
     */
    public final RxRetrofitClientBuilder params(WeakHashMap<String, Object> params) {
        PARAMS.putAll(params);
        return this;
    }

    /**
     * 传入请求参数
     *
     * @param key   参数名
     * @param value 参数值
     * @return 构造类
     */
    public final RxRetrofitClientBuilder params(String key, Object value) {
        PARAMS.put(key, value);
        return this;
    }

    /**
     * 传入上传文件
     *
     * @param file 要上传的文件
     * @return 构造类
     */
    public final RxRetrofitClientBuilder file(File file) {
        this.mFile = file;
        return this;
    }

    /**
     * 传入上传文件
     *
     * @param file 要上传的文件名
     * @return 构造类
     */
    public final RxRetrofitClientBuilder file(String file) {
        this.mFile = new File(file);
        return this;
    }

    /**
     * 传入上传的媒体文件
     *
     * @param raw 要上传的媒体文件
     * @return 构造类
     */
    public final RxRetrofitClientBuilder raw(String raw) {
        this.mBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), raw);
        return this;
    }

    /**
     * 传入成功请求的回调
     *
     * @param success 成功回调接口
     * @return 构造类
     */
    public final RxRetrofitClientBuilder success(ISuccess success) {
        this.mSuccess = success;
        return this;
    }

    /**
     * 传入失败请求的回调
     *
     * @param error 失败回调接口
     * @return 构造类
     */
    public final RxRetrofitClientBuilder error(IError error) {
        this.mError = error;
        return this;
    }

    /**
     * 传入自定义菊花样式
     *
     * @param context 上下文
     * @param style   菊花样式
     * @return 构造类
     */
    public final RxRetrofitClientBuilder loader(Context context, LoaderStyle style) {
        mContext = context;
        mLoaderStyle = style;
        return this;
    }

    /**
     * 传入默认菊花样式
     *
     * @param context 上下文
     * @return 构造类
     */
    public final RxRetrofitClientBuilder loader(Context context) {
        mContext = context;
        mLoaderStyle = LoaderStyle.BallSpinFadeLoaderIndicator;
        return this;
    }

    /**
     * 构造Retrofit连接类
     *
     * @return Retrofit连接类
     */
    public final RxRetrofitClient builder() {
        return new RxRetrofitClient(mUrl,
                PARAMS,
                mBody,
                mFile,
                mContext,
                mLoaderStyle,
                mSuccess,
                mError);
    }
}
